package cn.kgc.spring.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * @author: mosin
 * @version: v1.0  2022/7/4
 * 切面类 可以添加各种类型的通知
 */
@Component
@Aspect // 标记当前类是通知类
public class AllAdvice {

    // 实现切点表达式的复用
    @Pointcut("execution(* *(..))")
    public  void all(){ }



    // 前置通知
    @Before("all()")
    public void  before(){

        System.out.println("-------------前置通知---------------");

    }

    // 后置通知   核心业务出现异常 不会执行
    @AfterReturning("all()")
    public void  afterReturning(){

        System.out.println("-------------后置通知---------------");

    }


    // 最终通知  不管核心业务是否有异常 均要执行
    @After("all()")
    public void  after(){

        System.out.println("-------------最终通知---------------");

    }

    // 异常通知  核心业务出现异常时添加的通知  没有异常不添加
    @AfterThrowing("all()")
    public void  afterThrowing(){

        System.out.println("-------------异常通知---------------");

    }

    // 环绕通知
    @Around("all()")
    public Object  around(ProceedingJoinPoint proceedingJoinPoint){


        try {
            System.out.println("-------------环绕前置通知---------------");
            Object proceed = proceedingJoinPoint.proceed();
            System.out.println("-------------环绕后置通知---------------");
            return proceed;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("-------------环绕异常置通知---------------");
        } finally {
            System.out.println("-------------环绕最终通知---------------");
        }
        return  null;
    }

}
